Les projets réalisés par Agence Française de Développement


Réalisé par: ANDERSON AUGUSMA


Description du projet:

Ce projet est réalisé dans le cadre du cours Scraping et NLP de l'UE datamining du master 2 Econométrie & Statistiques de l'ISFA. Ce cours est enseigné par professeur Aurelien Couloumy. Pour réaliser ce projet, on va recuillir des données sur le site de l'AFD en faisant du scraping.

Objectif du projet:


L'objectif principal de ce projet est de regrouper les différents pays/villes bénéficiaires en fonction de leurs besoins ou leurs difficultés.


Pour atteindre cet objectif, on va jouer sur la description des projets réalisées dans chaque pays ainsi que le contexte dans lequel AFD avait jugé nécessaire d'apporter son aide à ce pays. On va proceder par la "word representation" pour resumer la description et le context en des mots les plus explicites possibles. Au final si deux ou plusieurs descriptions se ressemblent, cela signifie que la nécéssité était pareille pour la réalisation de ces projets. Ainsi les pays dans lesquels ces projets étaient réalisés avaient la même nécéssité ou mêmes besoins.

Les Parties du projet


Librairies nécessaires

1- Scraping

User-agent: * # CSS, JS, Images Allow: /core/*.css$ Allow: /core/*.css? Allow: /core/*.js$ Allow: /core/*.js? Allow: /core/*.gif Allow: /core/*.jpg Allow: /core/*.jpeg Allow: /core/*.png Allow: /core/*.svg Allow: /profiles/*.css$ Allow: /profiles/*.css? Allow: /profiles/*.js$ Allow: /profiles/*.js? Allow: /profiles/*.gif Allow: /profiles/*.jpg Allow: /profiles/*.jpeg Allow: /profiles/*.png Allow: /profiles/*.svg

On veut recuperer:


En parcourant le site AFD, on constate que les projets se repartissent en plusieurs pages soit 25 si on les affiches 64 par page. Ainsi pour recuperer les données de toutes ces pages on va constuire un tableau "All_link_page" qui reçoit tous les liens correspondants. Pour ce faire, on va jouer sur le premier l'url de la page active en modifiant "0&sort" et en y ajoutant 64 à chaque fois.



On a remarqué à chaque page les projet se divisent en deux groupes dans une balise "div" avec class "odd" et une autre class "even". Ainsi on recupere les données avec les deux scripts suivants:


Pour eviter de trop recharger les données à partir du site AFD à chaque fois, on va enregister le dataset sous format excel en local. La raison est les données sont volumineuses et cela prend beaucoup en execution et pour éviter de depaaser le nombre de tentatives de recupération de données sur le site.

2- Netoyage et Préparation des données

Visualisation

Visualisation du type de financement


Visualisation de la durée projets

Visualisation des secteurs d'activités

3-Word representation

Text cleaning process

1-Text initial

2- Tokenization

3- Elimination des Ponctuations

4- Lemming and Lowercasing

5- Elimination des stop words

6- Execution sur toutes les descriptions su dataset

Le nouveau dataset precedent contient les nombre de tokens restants pour chaque description après le cleaning.


7- Data visaualisation

A partir des boxplots de la figure ci-dessus, on peut voir au niveau des Ttopwords qu'on a pu reduire le nombre de mots à la moitié comparativement au boxplot de Tokenization.



Term Document Matrix

On peut remarquer que "eau" a la plus grande occurance.


On a créé un dataframe faisant la somme des occurances des mots pour chaque description de projet correspondant à chaque lieu.



Nettoyage de cette base de données

Pour le nettoyage de ce dataset, on va supprimer toutes les variables dont les valeurs sont nulles partout. Cela nous permettera d'enlever en grande partie les mots qui sont mal-tokenisés qui n'apparaissent au final ans aucune description. Ainsi on enleve tous les mots moins importants pour les descriptions.

Pour ce faire, on va faire la somme des lignes de chaque colonne si la somme est au plus égal à 1 (l'unité) on la suprime.


On remarque que les mots contenant que 2 caracteres ne cecrivent pas vraiment une description , on va enlever toutes les variables ayant que deux caractères.



4- Classification


Apprentissage non supervisé

Apprentissage supervisé


Normalisation des données


Reduction de dimensionnalité

PCA


Remarques:

Du resultat précédent on a remarqué qu'il y a des données qui sont complètement écrasées face aux outliers ce qui peut enpecher d'avoir une meilleure representation des données et peut rendre nos données difficilement exploitable avec simplement un Standascaler().

Dans la figure 2 "PCA robustScaler", n'est pas sensibles aux outliers. Il consiste à soustraire les données à la médiane et diviser par l'écart interqurtile, la médiane est moins sensible aux outliers que la moyenne.

Parcontre, on va utiliser Normalizer pour la suite de classifiaication puisqu'il fait une normalisation sur les lignes et il est mieux adapté pour la classification des texts (NLP) qui est notre cas.



TSNE

Notre dataset étant constitué d'un nombre important de variables une reduction avec TSNE est idéale. On verra ainsi sur le graphique suivant la différence de representation par rapport au PCA Normalizer précédemment. La classification qui sera constituée sera considérée sur les resultats du TSNE.



DBSCAN

Determination d'epsilon

Nous allons choisir un $\epsilon$ de tel sorte qu'on ait plus de 90% des observations aient une distance au proche voisin inférieure à $ \epsilon $. Ainsi on choisi $ \epsilon =100 $


Implémentation de l'algorithme

On constate 75 outliers suivant notre classement avec DBSCAN, une quantité assez faible par rapport 1537 observations que contient notre dataset. On decide de garder les outliers pour la suite, cette quantité n'aura pas un trop grand effet sur la classifiacation.



Méthode de K-means


Methode du coude

Pour determiner le nombre de clusters optimal onva utiliser la méthode du coude.

On conclut que le nombre de k optimal est 7


On fait un classement pour k=7

On precise que le dataset suivant "km_clusters" sera construit sur les resultats de kmeans TSNE.

Apprentissage supervisé

Dans cette partie, on va utiliser les données tokenisées pour predire les classes crées à partir du kmeans. Cela nous permettera de valider la classification qui a été faite. C'est-à-dire si la prediction est mausvaise, il y a forte chance que la classification Kmeans a été mauvaise.

Pour faire cette prediction, on va jouer seulement sur les parametres des models dans l'étape preprocessing. On ne pourra pas jouer sur les variables du dataset puisqu'elles sont trop volumineuses.


Procedure d'évaluation

On definit une fonction d'évaluation presentant les resultats sur le trainset et sur le testset. Dans cette fonction on fait intervenir la fonction lurning_curve qui va nous permettre de voir l'évolution de l'apprentisaage de la machine. Pour ce faire , on évalue le model sur plusieurs splits (autrement dit sur plusieurs lots du trainset) en commençant sur 10% des données jusqu'à 100% en 15 lots. Et sur chaque lot on applique une cross-validation de 5 splits. La cross-validation permettera de limitter le surapprentissage.



Modelisation

On va definir un un dictionnaire de models regroupant plusieurs algorithme de predictions, chacun definit definit sur pipeline qui nous permettera de jouer sur les parametres de chaque model importé.

Remarques:

  1. Le RandomForest donne un accuracy de 78% qui est un resultat relativement acceptable et c'est le model donnant le meilleur résultat. On constate entre autre un écart considérable entre l'apprentissage de trainset (train_score) et celui du testset (val_score). Parcontre il y a évolution sur le "val_score" car la courbe est croissante, ce qui sous-entend que si on injecte plus de données au model , la courbe peut continuer à croitre.
  1. Pour le model NaiveBayes qui est connu pour la classification des textes ne donne pas un bon résultat. On remarque la courbe d'apprentissage sur le val_score a tendence à redescendre. On peut supposer que la cause ce mauvais resultat est liée par le fait que le model "NaiveBayes" est éfficace lorsque les variables sont indepentantes, ce qui n'est pas forecement le cas ici puisque la quantité des variables est très volumineuse.
  1. Pour "Adaboost", on n'a pas un meilleur resultat mais on peut remarquer l'apprentaissage est quasiment le même sur le train_score et sur le val_score donc , il n'y a pas de risque de surapprentissage car il n'y a pas de grand écart entre les deux courbes. C'est ce qui explique la robustesse du model Boosting (L'entrainement sur plusieurs échantillons de mannière séquentielle en ameliorant au fur et à mesure chaque model-echantionnal).
  1. Pour SVM, le resultat est relativement pas mal avec un score de 67%. Peut-être avec plus de données on pourrait trouver mieux.
  1. KKN est le model le moins adapté avec notre situation, on peut voir son resultat est très faible avec 24% de score. Même sur le trainset, le resultat est tres mauvais.

Essai d'optimisation du resultat du model

On va essayer d'optimiser l'apprentissage avec RandomForest en jouant sur ses parametres pour voir si on peut trouver mieux. Pour ce faire, on va faire varier le nombre d'estimateurs "n_estimators" pour voir sur quelle valeur on obtient un meilleur resultat que celui précédemment.

On peut constater que le resultat reste toujours en-dessous de 80% , donc on ne peut pas trouver mieux par cette méthode.


Nomination des classes

On va attribuer un nom à chaque classe. Pour ce faire, on analyser le titre de chaque projet et recuper les mots ou le groupes de mots qui se repetent le plus dans une classe. Et ainsi nommer la classe en fonction des ces mots.

La classe_0 peut être nommée "Santé", ces pays/villes ont eu besoin de supports pour renforcer et ameliorer l'accès à la santé.


La classe_1 peut être nommée "Developpement durable" ces pays/villes ont eu des besoins dans le developpement durable.


La classe_2 peut être nommée "Developpement social", ce sont des pays/villes ayant bénéficié des supports dans le developpemnt de servces sociaux, ecole, projets communaux ou urbains.


La calsse_3 peut être nomée "Developpement du secteur agricol", ces pays ont eu besoin dans le secteur agricol.


La classe_4 peut être nommée "Electricité/ Energie renouvelapble". Ces pays ont eu des besoins au niveau d'électricité, des suppots pour construire de centres hydroélectirques.


La classe_5 peut être nommée "Eau potable et assainissement", ces pays/villes ont eu besoin dans l'assainissement.


La classe_6 peut être nommée: "Education et la fomation des jeunes". Ces pays/villes ont eu besoin dans la formation des jeunes pour leurs developpements.


Base de données finale